# pyplot的中文显示：第一种方法
# pyplot并不默认支持中文显示，需要reParams修改字体实现

# import matplotlib.pyplot as plt
# import matplotlib
#
# matplotlib.rcParams['font.family'] = 'SimHei'
# plt.plot([3,1,4,5,2])
# plt.ylabel("纵轴（值）")
# plt.savefig("test", dpi=600)
# plt.show()
# format_string:控制曲线的格式字符串，可选
# '.'点标记
# ','像素标记（极小点）
# 'o'实心圈
# 'v'倒三角标记
# '^'上三角标记
# '>'右三角标记
# '<'左三角标记

# '1'下花三角标记
# '2'上花三角标记
# '3'左花三角标记
# '4'右花三角标记
# 's'实心方形标记
# 'p'实心五角标记
# '*'星形标记

# 'h'竖六边形标记
# 'H'横六边形标记
# '+'十字标记
# 'x'x标记
# 'D'菱形标记
# 'd'瘦菱形标记
# '|'垂直线标记

# import matplotlib.pyplot as plt
# import numpy as np
# a = np.arange(10)
# plt.plot(a, a*1.5, 'go-', a, a*2.5, 'rv', a, a*3.5, '*', a, a*4.5, 'b-.')
# plt.show()
# import matplotlib.pyplot as plt
#
# plt.plot(x,y,format_string, **kwargs)
# color:控制颜色， color='green'
# linestyle:线条风格，linestyle=’dashed‘
# marker:标记风格，marker='o'
# markerfacecolor:标记颜色，markerfacecolor='blue'



# reParams的属性
# font.family 显示字体的名字
# “SimHei”中文楷体
# “Kaiti”中文楷体
# “LiSu”隶书
# ”FangSong“仿宋
# ”YouYuan“幼圆
# ”STSong“华文宋体
# .style字体风格，正常normal或斜体
# .size 字体大小，整数字号或者“large\x-smail”

# 横纵坐标都有汉字
# 第一种方法
# import numpy as np
# import matplotlib.pyplot as plt
# import matplotlib
#
# matplotlib.rcParams['font.family'] = 'SimHei'
# matplotlib.rcParams['font.size'] = 20
# a = np.arange(0.0, 5.0, 0.02)
# plt.xlabel("横轴：时间")
# plt.ylabel("纵轴：振幅")
# plt.plot(a, np.cos(2*np.pi*a), 'r--')
# plt.show()

# 建议第第二种方法
# 有中文输出的地方，增加一个属性：fontproperties
# 例子
# import numpy as np
# import matplotlib.pyplot as plt
# a = np.arange(0.0, 5.0, 0.02)
# plt.xlabel("横轴：时间", fontproperties="SimHei", fontsize=20)
# plt.ylabel("纵轴：振幅", fontproperties="SimHei", fontsize=20)
# plt.plot(a, np.cos(2*np.pi*a), "r--")
# plt.show()

# pyplot的文本显示函数
# plt.xlabel()   对x轴增加文本标签
# plt.ylabel()   对Y轴增加文本标签
# plt.title()    对图形增加文本标签
# plt.text（）    在任意位置增加文本
# plt.annotate（） 在图形中增加带箭头的注解

# import numpy as np
# import matplotlib.pyplot as plt
# a = np.arange(0.0, 5.0, 0.02)
# plt.plot(a, np.cos(2*np.pi*a), 'r--')
# plt.xlabel("横轴： 时间", fontproperties="SimHei", fontsize=15, color="green")
# plt.ylabel("纵轴：振幅",fontproperties="SimHei", fontsize=15)
# plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties="SimHei", fontsize=25)
# # 横轴坐标设定为-1~6 纵轴坐标设定为-2~2
# plt.text(2, 1, r'$\mu=100$', fontsize=15)
# plt.axis([-1, 6, -2, 2])
# plt.grid(True)
# plt.show()

# 报错
#     raise ValueError(
# ValueError: None is not a valid value for fontset; supported values are 'cm', 'dejavuserif', 'dejavusans', 'stix', 'stixsans', 'custom'
# plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
# s 要注解字符串  xy是箭头所在位置  xy——text文本所在位置
# 箭头
# import numpy as np
# import matplotlib.pyplot as plt
# a = np.arange(0.0, 5.0, 0.02)
# plt.plot(a, np.cos(2*np.pi*a), 'r--')
# plt.xlabel("横轴： 时间", fontproperties="SimHei", fontsize=15, color="green")
# plt.ylabel("纵轴： 振幅",  fontproperties="SimHei", fontsize=15)
# plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties="SimHei", fontsize=25)
# plt.annotate(r'$\mu=100￥', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black', shrink=0.1, width=2))
# # 横轴坐标设定为-1~6 纵轴坐标设定为-2~2
# plt.text(2, 1, r'$\mu=100$', fontsize=15)
# plt.axis([-1, 6, -2, 2])
# plt.grid(True)
# plt.show()

# 子绘图区域
# plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
# 设定网格，选中网格，确定选中行列区域数量，编号从0开始
# import matplotlib.pyplot as plt
#
# plt.subplot2grid((3,3), (1,0), colspan=2)
# # 3行3列， 坐标为（1，0） 延申长度为2

# import matplotlib.pyplot as plt
# import matplotlib.gridspec as gridspec
# gs = gridspec.GridSpec(3, 3)
# ax1 = plt.subplot(gs[0, :])
# ax2 = plt.subplot(gs[1, :-1])
# ax3 = plt.subplot(gs[1:, -1])
# ax4 = plt.subplot(gs[2, 0])
# ax5 = plt.subplot(gs[2, 1])

# pyplot基础图表函数概述

# plt.plot(x,y,fmt,....)  绘制一个坐标图
# plt.boxplot(data, notch, position)绘制一个箱形图
# plt.bar(left,height,width,bottom)绘制一个条形图
# plt.barh(width, bottom, left, height)绘制一个横向条形图
# plt.polar(theta,r)绘制极坐标图
# plt.pie(data, explode)绘制饼图
# plt.contour(X,y,z,n)绘制等值图
# plt.vlines()绘制垂直图
# plt.steam(x,y,linefmt,markerfmt)绘制柴火图
# plt.plot_date()绘制数据日期

# 饼图绘制
# import matplotlib.pyplot as plt
# labels = 'Fw', 'Hw', 'Dw', 'Lw'
# sizes = {15, 30, 45, 10}
# explode = (0, 0.1, 0, 0)
# plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
# plt.show()

# size尺寸 explode指的是那块突出出来 labels每一块标签 autopct显示百分数方式 shadow是否是一个带阴影的饼图效果 startangle起始的角度

# import matplotlib.pyplot as plt
# labels = ['Fw', 'Hw', 'Dw', 'Lw']
# sizes = [15, 30, 45, 10]
# explode = (0, 0.1, 0, 0)
# plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
# # 改成正圆形的饼图
# # plt.axis('equal')
# plt.show()
# 报错：TypeError: float() argument must be a string or a number, not 'set'

# 直方图的绘制
# plt.hist()

# import numpy as np
# import matplotlib.pyplot as plt
# np.random.seed(0)
# mu, sigma = 100, 20  # 均值和标准差
# a = np.random.normal(mu, sigma, size=100)
# # plt.hist(a, 20, normed=1, histtype='stepfilled', facecolor='b', alpha=0.75)
# # normed=1的属性已经取消，可以使用density=True
# plt.hist(a, 100, density=True, histtype='stepfilled', facecolor='r', alpha=0.75)
# plt.title('Histogram')
# plt.show()

# 20为直方图的个数，20生成的直立的放行有20个。

# 极坐标图
# import numpy as np
# import matplotlib.pyplot as plt
# # N =20
# N = 10
# #绘制极坐标周的数据个数
# theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
# radii = 10 * np.random.rand(N)
# # width = np.pi / 4 * np.random.rand(N)
# width = np.pi / 2 * np.random.rand(N)
#
# ax = plt.subplot(111, projection='polar')
# bars = ax.bar(theta, radii, width=width,bottom=0.0)+
# print(bars)
# for r, bar in zip(radii, bars):
#     bar.set_facecolor(plt.cm.viridis(r/10.))
#     bar.set_alpha(0.5)
# plt.show()



# 散点图
# import numpy as np
# import matplotlib.pyplot as plt
#
# fig, ax = plt .subplots()
# # ax.plot(10*np.random.rand(100), 10*np.random.randn(100), 'o')
# ax.plot(np.random.rand(100), np.random.randn(100), '^')
# ax.set_title('Simple Scatter')
# plt.show()

# 引力波的数据
# http://python123.io/dv/grawave.html
# http://python123.io/dv/H1_Strain.wav
# http://python123.io/dv/L1_Strain.wav
# http://python123.io/dv/wf_template.txt

import pandas as pd
import numpy as np
b = pd.Series([9,8,7,6],['你','是','啥','比'])
print(b)
print('c' in b)
print(0 in b)
print(b.get("你","啥也不是"))


# 做相加
a = pd.Series([9,8,7,6],['你','是','啥','比'])
c = pd.Series([9,7],['是','啥'])
print(a+c)

# series对象和索引可以有一个名字，存储再属性.name中
d = pd.Series([9,8,7,6],['你','是','啥','比'])
d.name = "series对象"
d.index.name = "索引列"
print(d.name)
print(d.index.name)

# Series字典类型创建
e = pd.Series({'a':9,'b':8,'c':10},index=['c','b','a','d'])
print(e)

#从ndarray创建
f=pd.Series(np.arange(5))
print(f)

# 给出值和索引
g=pd.Series(np.arange(5),index=np.arange(9,4,-1))
print(g)

# index和value类型
h = pd.Series([9,8,7,6],['a','b','c','d'])
print(h)
# 获得索引
print(h.index)
# 获得数据
print(h.values)
# 自动索引和自定义索引并存
print(h[2])
print(h["b"])
# 两者不能并存，但不能露用
# print(h['a', 'b', 0])
# Series类型类似于ndarray类型有相似之处
# 索引[]
# numpy中运算和操作可用于series类型
# 可以通过自定义列表进行切片

i = pd.Series([9,1,2,3],['a','b','c','d'])
print(i[3])
print(i[:3])
print("-------------")
# 中值
print(i[i>i.median()])
print("!!!!!!!!!!!!!!!!!")
# e的x幂次方
print(np.exp(h))

# DataFrame 索引加多列数据  纵向索引为index 横向索引为column
# index_0  data_a  data_w
# index_1  data_b
# index_2  data_c
# index_3  data_d

# DataFrame是一个表格形的数据类型，每列类型可以不同
# 既有行索引，也有列索引，常用表达二维数据，也可表达多维数据
# 二维ndarray对象，由一维ndarray、列表、字典、元组或Series构成的字典

#二维ndarray对象创建,增加了横向和纵向的索引
j = pd.DataFrame(np.arange(10).reshape(2,5))
print(j)

# 从一维ndarray对象字典创建
k = {'one':pd.Series([1,2,3],index=['a','b','c']),
     'two':pd.Series([9,8,7,6], index=['a','b','c','d'])}
l = pd.DataFrame(k)
print(l)

m = pd.DataFrame(k, index=['b','c','d'], columns=['one','two','three'])
print(m)

# 列表类型的字典去创建
n = {'one':[1,2,3,4], 'two':[9,8,7,6]}
n1 = pd.DataFrame(n, index=['a', 'b', 'c','d'])
print(n1)

o = {"城市":['北京',"上海","广州","深圳","沈阳"],
     "环比":['101.5','103.5','156.2','109.5','100'],
     "同比":['120.5','110.5','140.2','191.5','195.6'],
     "定基":['101.4','109.5','176.2','109.8','109']}
# o = [['北京',"上海","广州","深圳","沈阳"],
#      ['101.5','103.5','156.2','109.5','100'],
#      ['120.5','110.5','140.2','191.5','195.6'],
#      ['101.4','109.5','176.2','109.8','109.6']]


o1 = pd.DataFrame(o, index=['1','2','3','4','5'])
# o1 = pd.DataFrame(o, index=[np.arange(5)],columns=["城市","环比","同比","定基"])
print(o1)
print(o1["城市"])
# pandas中有iloc、loc、ix数据提取方法，其中
# iloc：是位置索引
# loc：是标签索引
# ix：结合了iloc和loc的用法，首先会尝试loc一样的行为，如果索引中不存在标签，则会退回iloc一样的行为
# 但是已经不建议使用ix
print(o1.loc['4'])
print(o1.iloc[1])
# print(o1["同比"]["2"])

# pandas数据类型操作，改变Series和DateFrame对象 增加和重拍：重新索引、删除drop
# 重新索引.reindex()能够改变或重排Series和DateFrame索引
o2 = o1.reindex(index=['5','4','3','2','1'])
print(o2)
o3 = o1.reindex(columns=["城市","环比","同比","定基"])
print(o3)

# fill_value 重新索引，用于添加缺失的值 method为填充方法， ffill当前值向前填充，bfill向后填充
# limit 最大填充量
# copy 默认True,生成新的对象，Flase时，新旧相等不复制

# 重新索引
newc = o1.columns.insert(4, "新增")
newd = o1.reindex(columns=newc, fill_value=200)
print(newd)

print(o1.index)
print(o1.columns)

# .append(idx) 连接另一个index对象，产生新的index对象
# .diff(idx) 计算差集，生成新的index对象
# .intersections(idx) 计算交集
# .union(idx) 计算并集
# .delete(idx) 删除loc位置处的元素
# .insert(loc,e) 在loc位置增加一个元素e
print("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\")
print(o1)
nc = o1.columns.delete(2)
print(nc)
# 删除第二列数据
ni = o1.index.insert(5, "6")
print(ni)
# # 添加第五行数据
nd = o1.reindex(index=ni, columns=nc).ffill()
print(nd)

print("qqqqqqqqqqqqqqqqqqq")
# .drop()能够删除Series和DataFrame指定行或列索引
q = pd.Series([9,8,7,6], index=['a','b','c','d'])
print(q)
q1 = q.drop(['b','c'])
print(q1)

# 删除同比的话要加 axis=1  o1.drop('同比',axis=1)

# 算数运算根据行列索引,补齐后运算,运算默认产浮点数,补齐NAN,二维和一维,一维,和零维为广播运算  + - * /产生新的对象
r = pd.DataFrame(np.arange(12).reshape(3,4))
print(r)
r1 = pd.DataFrame(np.arange(20).reshape(4,5))
print(r1)
print(r+r1)
print(r-r1)
print(r*r1)
print(r/r1)

# 算数运算
# .add(d, **argws)
# .sub(d, **argws)
# .mul(d, **argws)
# .div(d, **argws)

print(r1.add(r, fill_value = 100))

# 比较运算,只能相同索引元素,不进行补齐 > < >= <= == !=
# series = 索引 + 一维数据
# DateFrame = 行列索引 + 二维数据
# 理解数据类型与索引的关系,操作索引既操作数据
# 默认纵向
# .sort_index 对数据的索引进行排序运算 .sort_index(axis=0, ascending=True)  ascending=False 为降序排序

# .sort_values 对 数值进行排序 Series.sort_values(axis=0,ascending=True) 升序
# DataFrame.sort_values(by, axis=0, ascending=True)  by是axis轴上的某个索引或索引列表

# .sum 总和
# .count() 非NAN值的数量
# .mean() .median() 平均值 中位数
# .var() .std() 计算数据的方差\标准差
# .min() .max() 最小值 最大值

# 基本的统计分析函数
# .describe() 针对0轴(各列的统计汇总)
z = pd.Series(['9','8','7','6'], index=['a','b','c','d'])
print(z)
z1=z.describe()
# z.describe()['count']
print(z1)


x=pd.DataFrame(np.arange(20).reshape(4,5), index=['c','a','b','d'])
print(x.describe()[2])  #加type
# print(x.describe().ix['max'])  #加type

# .cumsum()  累计和
# .cumprod()  累计积数
# .cummax()  累计最大值
# .cummin()  累计最小值

# 滚动计算
# .rolling(w).sum()      依次计算相邻w个元素的和
# .rolling(w).mean()     依次计算相邻w个元素的算数平均数
# .rolling(w).var()       依次计算相邻w个元素的算数方差
# .rolling(w).std()       依次计算相邻w个元素的标准差
# .rolling(w).min().max()  依次计算相邻w个元素的最大值和最小值

# .cov()  计算协方差矩阵
# .corr()  计算相关系数矩阵